package com.logistics.erp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.logistics.erp.entity.domain.*;
import com.logistics.erp.entity.model.*;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Mapper
public interface ErpOrderMapper extends BaseMapper<ErpOrder> {

    /**
     * 查找物料信息
     * @param params
     * @return
     */
    List<ErpOrder> findErpOrderList(Map<String, Object> params);

    /**
     * 根据领导单号查找优先级
     * @param code
     * @return
     */
    Map<String, Object> findErpOrderPriority(String code);

    /**
     * 查找任务流行信息
     * @param params
     * @return
     */
    ErpFlow findErpFlow(Map<String, Object> params);

    /**
     * 根据任务号查找物料流向
     * @param params
     * @return
     */
    List<MaterialFlow> findMaterialFlows(Map<String, Object> params);

    /**
     * 查找计划数量
     * @param billNos
     * @return
     */
    List<ErpPlanQty> findPlanQty(List<String> billNos);

    /**
     * 查找拣配数量
     * @param billNos
     * @return
     */
    List<ErpLackMaterial> findPickActualQty(List<String> billNos);

    /**
     * 查找实际数量
     * @param params
     * @return
     */
    BigDecimal findActualQty(Map<String, Object> params);

    /**
     * 根据领料单号查询是否可拣配
     * @param billNo
     * @return
     */
    Integer findIsPicking(String billNo);

    /**
     * 根据拣配单号 更新状态
     * @param params
     */
    void updatePickStatus(List<String> params);

    /**
     * 根据拣配单号 更新状态
     */
    void updatePickStatusPaint(String billNo, String itemCode);

    /**
     * 更新拣配数量
     * @param params
     */
    void updatePickQty(Map<String, Object> params);

    /**
     * 更新配送时间
     * @param params
     */
    void updateDeliveryTime(Map<String, Object> params);

    /**
     * 通过任务号获取物料信息
     * @param taskNo
     * @return
     */
    ErpOrder findMaterialInfo(@Param("taskNo") String taskNo);

    /**
     * 通过任务号进行直投处理
     * @param entity
     * @return
     */
    void callMaterialDirectPut(ErpDirectSave entity);

    /**
     * 暂存处理
     * @param erpStashSave
     * @return
     */
    void insertStash(ErpStashSave erpStashSave);

    /**
     * 查找ERP用户信息
     * @param params
     * @return
     */
    ErpPerson findUserByCodeAndPw(Map<String, Object> params);


    /**
     * 查找缺料列表
     * @param billNos
     * @return
     */
    List<ErpLackMaterial> findLackMaterialInfo(List<String> billNos);

    /**
     * 更改拣配数量
     * @param params
     */
    void updateOrderDetailPickQty(Map<String, Object> params);

    /**
     * 更改拣配状态
     * @param ids
     */
    void updateOrderDetailStatus(List<String> ids);

    /**
     * 更正拣配时间
     * @param id
     */
    void updateOrderDetailDeliveryTime(String id);

    /**
     * 查找有没有暂存过
     * @param param
     * @return
     */
    Integer findNoDemand104T(Map<String, Object> param);

    /**
     * 更新暂存数据
     * @param param
     */
    void updateNoDemand104T(ErpStashSave param);

    /**
     * 查找是否是直投部门
     * @param itemNo
     * @return
     */
    List<ErpDept> findDeptByItemCode(String itemNo);

    /**
     * 根据部门获取需求数量
     * @param deptCodes
     * @return
     */
    List<MaterialBillRow> repQtyByDept(List<String> deptCodes, String taskNo);

    /**
     * 查找来源为工序交接
     * @param param
     * @return
     */
    List<ErpDeliveryOrderDetail> findSourceFromTakeOver(Map<String, Object> param);

    /**
     * 查找进行过工序交接
     * @param taskNo
     * @return
     */
    Integer countTakeOver(String taskNo);

    /**
     * 查询流向标签
     * @param param
     * @return
     */
    List<ErpDeliveryOrderDetail> findFlowInfo(Map<String, Object> param);

    /**
     * 执行工序交接
     * @param taskNo
     * @return
     */
    void insertPacRoutingOpProcess(String taskNo);

    /**
     * 执行内部交接
     * @param taskNo
     * @return
     */
    void insertPacRoutingOpInside(String taskNo);
    /**
     * 根据出库单号和任务号获取物料信息
     * @param code
     * @param billNo
     * @return
     */
    ErpOrder findMaterialData(@Param("code") String code,@Param("billNo") String billNo);

    /**
     * 更新配送时间
     * @param params
     */
    void updateDeliveryPaint(Map<String, Object> params);

    /**
     * 根据拣配单号 更新状态
     */
    void updatePickQtyPaint(Map<String, Object> params);

    /**
     * 根据扫描的任务号，获取任务的物料信息以及提出外协的部门
     * @param taskNo
     * @return
     */
    PacOptransBillDetail materialByTaskNo(String taskNo);

    /**
     * 外协任务需要质检，判断是否已经质检完成
     * @param taskNo
     * @return
     */
    QcWxDetailV receptionQuality(String taskNo);

    /**
     * 全部质检完成,将if_yes 更新为 'Y'
     * @param taskNo
     */
    void updateIfYes(String taskNo);

    /**
     * 判断任务是否领料齐全
     * @param taskNo
     * @return
     */
    String pickingComplete(String taskNo);

    /**
     * 扫描任务号显示的物料信息
     * @param taskNo
     * @return
     */
    MaterialReception materialReception(String taskNo);

    /**
     * 质检完成和领料齐全后，执行以下存储过程
     * @param erpReceptionSave
     */
    void callMaterialErpReception(ErpReceptionSave erpReceptionSave);

    /**
     * 验证是否记账成功
     * @param piOrderNoOne
     * @return
     */
    List<String> statusByOrderNo(String piOrderNoOne);

    /**
     * erp 获取失败消息
     * @param erpUniqueId
     * @return
     */
    String findErrMsg(String erpUniqueId);

    /**
     * 存储过程 inware_tz_autowghb_sp
     * @param piOrderNoOne
     */
    void callMaterialErpInware(String piOrderNoOne);

    /**
     * 根据任务号查询 source_method
     * @param piOrderNoOne
     * @return
     */
    String getsourceMethod(String piOrderNoOne);

    /**
     * 入库打印信息查询
     * @param code
     * @return
     */
    ErpDeliveryOrderDetail inbound(String code);
}
